package com.hello.single;

/**
 * 单例模式-懒汉模式
 * 1、定义一个静态变量实例
 * 2、定义一个静态函数创建并返回实例
 * 3、私有化构造函数
 */
public class SerInnerLanhanSingle4 {


    private static SerInnerLanhanSingle4 single;

    private SerInnerLanhanSingle4(){};

    public static SerInnerLanhanSingle4 getInstance() {
        return InnerClass.single;
    }

    /**
     * 内部类的虚拟机机制，只有当访问类的时候，才会加载，
     * 因此， 既保证了懒加载(节省内存)，又保证了线程安全。
     */
    private static class InnerClass{
        private static final SerInnerLanhanSingle4 single = new SerInnerLanhanSingle4();
    }

    /**
     * 我们重写了readResolve方法，在该方法中直接返回了我们的内部类实例。
     * 重写readResolve() 方法，防止反序列化破坏单例机制，
     * 这是因为：反序列化的机制在反序列化的时候，会判断如果实现了serializable或者externalizable接口的类中包含readResolve方法的话，
     * 会直接调用readResolve方法来获取实例。这样我们就制止了反序列化破坏我们的单例模式
     * @return
     */
    public Object readResolve() {
        return InnerClass.single;
    }

}
